在上一篇,我們介紹了 gRPC 以及建例 proto 檔,今天要來介紹如何使用 gRPC 來建立一套 Server,以及在 Client 端如何去呼叫 Server 端。
先帶來如何建立一個 Server 端,一樣先建立好 proto 檔,可以參考上一篇:
syntax = "proto3";
option go_package = ".;student";
package student;
service StudentServer {
rpc GetStudentData (GetStudentDataReq) returns (GetStudentDataRes) {}
}
message GetStudentDataReq {
int64 student_id = 1;
string class = 2;
}
message GetStudentDataRes {
string student_name = 1;
int64 student_heigh = 2;
int64 student_weight = 3;
}
我們要起的服務,包括一隻 GetStudentData API,接著就要建立 main function,將服務起起來:
package main
import (
"context"
"fmt"
"net"
"os"
"os/signal"
"syscall"
"google.golang.org/grpc"
"google.golang.org/grpc/reflection"
student "student/pb"
)
type studentServer struct {
}
func main() {
var (
err error
shutdownObserver = make(chan os.Signal, 1)
)
// 設定要監聽的 port
lis, err := net.Listen("tcp", ":3010")
if err != nil {
panic(err)
}
// 使用 gRPC 的 NewServer meethod 來建立 gRPC Server
grpcServer := grpc.NewServer()
sv := &studentServer{}
student.RegisterStudentServerServer(grpcServer, sv)
// 在 gRPC 伺服器上註冊反射服務。
reflection.Register(grpcServer)
go func(gs *grpc.Server, c chan<- os.Signal) {
err := gs.Serve(lis)
if err != nil {
shutdownObserver <- syscall.SIGINT
}
}(grpcServer, shutdownObserver)
signal.Notify(shutdownObserver, syscall.SIGHUP, syscall.SIGINT, syscall.SIGQUIT, syscall.SIGTERM)
//阻塞直到有信號傳入
s := <-shutdownObserver
fmt.Println(`Receive signal:`, s)
// 優雅停止GRPC服務
grpcServer.GracefulStop()
}
func (s *studentServer) GetStudentData(ctx context.Context, in *student.GetStudentDataReq) (r *student.GetStudentDataRes, err error) {
r = &student.GetStudentDataRes{
StudentName: "JC",
StudentHeigh: 178,
StudentWeight: 70,
}
return r, err
}
如此一來,就可以起動這個 Server!
在 Client 端,要呼叫服務端,作法很簡單,直接看程式碼:
package main
import (
"context"
"fmt"
"log"
"google.golang.org/grpc"
"student/pb"
)
var client student.StudentServerClient
func main() {
// 建立連線
conn, err := grpc.Dial("localhost:3010", grpc.WithInsecure())
if err != nil {
fmt.Println("連線失敗:", err)
}
// 最後關閉練線
defer conn.Close()
// 用 proto 提供的 NewStudentServerClient,來建立 client
client = student.NewStudentServerClient(conn)
GetStudent(1, "A")
}
func GetStudent(studentId int64, class string) {
res, err := client.GetStudentData(context.Background(),
&student.GetStudentDataReq{
StudentId: studentId,
Class: class,
})
if err != nil {
log.Fatalf("GetStudentData error: %v", err)
}
fmt.Println(res) //執行結果
}
這樣將可以建立 Client 端連線了,使用 Server 端提供的服務
今天帶來如何在 Go 語言中使用 gRPC,建出一套 Server 和 Client,使用起來不會太過複雜,如果你是想以 Go 語言來開發網站,那 gRPC 是你必須學的一大課題,點對點的即時通訊,使得他非常適合於微服務,會帶來非常高的效率。
感謝各位讀者今天的閱讀,希望對你有幫助!